
package highvoltage;

import highvoltage.skeletonHelpers.*;

import java.util.LinkedList;
import java.util.List;

/**
 * Útelemet jelképezõ osztály.
 * 
 * @author Tomi
 * @version 1.0
 * @created 16-márc.-2010 21:08:06
 */
public class RoadSegment
{
	private SpeedLimit _currentSpeedLimit;
	/**
	 * Az alapértelmezett sebességkorlátozás nagysága.
	 */
	private static float _defaultSpeedLimitValue;
	/**
	 * Az útelemen tartózkodó jármû csomagoló osztálya.
	 */
	protected VehicleWrapper _vehicleWrapper;

	/**
	 * Az útszegmenshez kapcsolódó elemek csomagolói.
	 */
	private List<RoadSegmentWrapper> connections = new LinkedList<RoadSegmentWrapper>();

	public RoadSegment()
	{
		Logger.print( "RoadSegment::RoadSegment()", this );
		Logger.ret();
	}

	/**
	 * Polimorf konstruktor, a konstruktor hívási láncból adódó problémák ellen.
	 * Esetünkben, a leszármazott osztályok konstruktorai jelentősen eltérnek a
	 * szülőétől.
	 */
	public void init()
	{
		Logger.print( "RoadSegment::init()", this );

		if ( UserInput.yesNo( "Tesz le jarmuvet?" ) )
		{
			Logger.call( "Civilian::Civilian" );
			Civilian civil = new Civilian();

			Logger.call( "VehicleWrapper::VehicleWrapper(civil)" );
			VehicleWrapper vwrapper = new VehicleWrapper( civil );

			World world = World.getInstance();

			Logger.call( String.format( "World::registerSteppable(VehicleWrapper | %d)", vwrapper.hashCode() ) );
			world.registerSteppable( vwrapper );

			Logger.call( "RoadSegment::enter(vwrapper)", this );
			enter( vwrapper );

		}

		Logger.ret();
	}

	/**
	 * Ráhelyezi az útelemre a jármûvet (a típusnak megfelelõen a Visitor minta
	 * szerint), és frissti a currentSpeedLimit objektumot a rajta közlekedõ
	 * jármû sebességére, ha az kisebb mint az alapértelmezett.
	 * 
	 * @param vehicle
	 *            A belépõ jármû csomagolója.
	 */
	public void enter( VehicleWrapper vehicleWrapper )
	{
		Logger.print( String.format( "RoadSegment::enter( vehicleWrapper | %d )", vehicleWrapper.hashCode() ), this );

		if ( _vehicleWrapper != null ) // Nem tudok jobbat.
		{
			Logger.print( "Megj.: Mar van jarmu az utelemen." );

			Logger.call( String.format( "Vehicle::accpet(v | %d)", _vehicleWrapper.getVehicle().hashCode() ), vehicleWrapper.getVehicle() );
			vehicleWrapper.getVehicle().accept( _vehicleWrapper.getVehicle() );
		}
		else
		{
			_vehicleWrapper = vehicleWrapper;
		}

		Logger.call( "VehicleWrapper::setCurrentRS(this)", vehicleWrapper );
		vehicleWrapper.setCurrentRS( this );

		Logger.ret();
	}

	/**
	 * Visszatér a választható irányokkal.
	 */
	public List<Float> getAngles()
	{
		Logger.print( "RoadSegment::getAngles()", this );

		LinkedList<Float> list = new LinkedList<Float>();

		for ( RoadSegmentWrapper rsw : connections )
		{
			list.add( rsw.getAngle() );
		}

		Logger.ret();

		return list;
	}

	/**
	 * Visszaadja az adott irányban fekvõ RSW-t, vagy <b>null</b>-t.
	 * 
	 * @param angle
	 *            A keresett irány.
	 */
	public RoadSegmentWrapper getRSWFromAngle( float angle )
	{
		Logger.print( "RoadSegment::getRSWFromAngle(angle)", this );

		Logger.ret();

		return null;
	}

	/**
	 * Visszatér a currentSpeedLimit objektummal.
	 */
	public SpeedLimit getSpeedLimit()
	{
		Logger.print( "RoadSegment::getSpeedLimit()", this );
		Logger.ret();

		return null;
	}

	/**
	 * <b>Null</b>-ra állítja a vehicle referenciát (vagyis elhagyja az útelemet
	 * a jármû)
	 */
	public void leave()
	{
		Logger.print( "RoadSegment::leave()", this );
		
		_vehicleWrapper = null;
		
		Logger.ret();
	}

	/**
	 * Csatlakoztat egy útelemet, bejövő csomagolóval.
	 * 
	 * @param rs
	 *            A csatlakoztatandó útelem.
	 */
	public void addIncomingSegment( RoadSegment rs )
	{
		Logger.print( String.format( "RoadSegment::addIncomingSegment(rs | %d)", rs.hashCode() ), this );
		Logger.call( "IncomingRoadSegmentWrapper::IncomingRoadSegmentWrapper( rs )" );
		IncomingRoadSegmentWrapper irsw = new IncomingRoadSegmentWrapper( rs );
		connections.add( irsw );
		Logger.ret();
	}

	/**
	 * Csatlakoztat egy útelemet, kimenő csomagolóval.
	 * 
	 * @param rs
	 *            A csatlakoztatandó útelem.
	 */
	public void addOutgoingSegment( RoadSegment rs )
	{
		Logger.print( String.format( "RoadSegment::addOutgoingSegment(rs | %d)", rs.hashCode() ), this );
		Logger.call( "OutgoingRoadSegmentWrapper::OutgoingRoadSegmentWrapper( rs )" );
		OutgoingRoadSegmentWrapper orsw = new OutgoingRoadSegmentWrapper( rs );
		connections.add( orsw );
		Logger.ret();
	}

}
